package memory

import (
	. "com.mgface.disobj/common"
	. "com.mgface.disobj/metanode/mq/mgfacemq/currentnodeinfo"
	"com.mgface.disobj/metanode/mq/mgfacemq/file"
	"time"
)

//刷新内存数据，并把内存数据写入文件
func (cache *Memorystore) FlushData(nodeinfo *CurrentNodeInfo) {
	if cache.EnableClean {
		ticker5 := time.NewTicker(5 * time.Second)

		ticker2 := time.NewTicker(2 * time.Second)
		for {
			select {
			//从定时器里面读取数据
			case <-ticker5.C:
				cache.Mutex.Lock()
				//假如当前节点不是master，把自身变成slave，不主动启动心跳检测过期处理
				//主要是为了让datanaode只向master节点汇报心跳，减少tcp交互，然后由master把内存存储的meta数据同步给其他slave
				//APINode服务可以接入slave，因为slave有完整从master同步过来的内存数据，可以达到提高多个matanoade的使用效率
				//todo metadatanode集群也要注册所有的metadatanode作为原数据，供Apiserver做高可用，高负载使用metadatanode集群，同时Apiserver可以缓存这些数据
				if nodeinfo.DecideMaster() {
					for key, mvalues := range cache.Datas {
						//对心跳数据进行过期处理
						if key == "dataNodes" || key == "apiNodes"|| key == "metaNodes" {
							legal := make([]MetaValue, 0)
							if forceTxData, ok := mvalues.([]MetaValue); ok {
								for _, value := range forceTxData {
									if time.Now().Before(value.Created.Add(5 * time.Second)) {
										legal = append(legal, value)
									}
								}
							}
							cache.Datas[key] = legal
						}
					}
				}
				//把内存数据写入log文件
				file.Storememdata(cache.StorePath, cache.Datas)
				cache.Mutex.Unlock()
			case <-ticker2.C:
				//清理log文件
				file.ClearLogfile(cache.StorePath)
			}

		}
	}
}
